import socket
import struct

# 设置UDP接收器
UDP_IP = "127.0.0.1"  # 本地IP
UDP_PORT = 8090       # 与OpenSees中udpRecorder端口一致

print(f"UDP监听IP: {UDP_IP}")
print(f"UDP监听端口: {UDP_PORT}")

# 创建UDP socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind((UDP_IP, UDP_PORT))

print("开始接收数据...")

# 持续接收数据
while True:
    data, addr = sock.recvfrom(1024)  # 缓冲区大小1024字节
    
    # 如果收到的数据长度等于double的大小
    if len(data) == 8:  # 8字节 = 64位 = 一个double值
        # 将二进制数据解包为double
        displacement = struct.unpack('d', data)[0]
        print(f"收到位移: {displacement:.10e} 来自: {addr}")
    else:
        # 如果数据格式不匹配，尝试以字符串形式解析
        try:
            print(f"收到数据(非标准格式): {data.decode()} 来自: {addr}")
        except:
            print(f"收到数据(二进制): {len(data)}字节 来自: {addr}")